package com.example;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.json.JSONUtil;
import com.example.entity.Dog;
import com.example.entity.DogDTO;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Map;

@SpringBootTest
public class CopyObjectDTO {

    /**
     * 方法 1：使用 BeanUtil.copyProperties（最推荐）
     * Hutool 的 BeanUtil 支持同名字段复制，字段不存在会自动忽略。
     * 两个类之间字段名必须相同，否则不能复制
     * 可以设置是否忽略 null 值（使用 CopyOptions）
     */
    @Test
    public void test1() {
        Dog dog = new Dog("xiaowang", 23, "2024201823@aust.com");
        System.out.println(dog);
        DogDTO dogDTO = BeanUtil.copyProperties(dog, DogDTO.class);
        System.out.println(dogDTO);
    }

    /**
     * 方法 2：手动从 Map 中提取需要的字段再转为目标类
     * 适合字段名字不一样，或者需要重命名的场景。
     */
    @Test
    public void test2() {
        Dog dog = new Dog("xiaowang", 23, "2024201823@aust.com");
        System.out.println(dog);
        Map<String, Object> map = BeanUtil.beanToMap(dog);
        System.out.println(map);

        // 手动筛选字段
        Map<Object, Object> filtered = MapUtil.builder()
                .put("name", map.get("name"))
                .put("age", map.get("age"))
                .build();

        // 转为DTO
        DogDTO dogDTO = BeanUtil.mapToBean(filtered, DogDTO.class, true);
        System.out.println(dogDTO);
    }

    /**
     * 用 JSON 中转（适合跨类结构转换）
     */
    @Test
    public void test3() {
        Dog dog = new Dog("xiaowang", 23, "2024201823@aust.com");
        System.out.println(dog);

        // 转为 JSON 字符串
        String jsonStr = JSONUtil.toJsonStr(dog);
        System.out.println(jsonStr);

        // JSON 转为目标类（字段名需匹配）
        DogDTO bean = JSONUtil.toBean(jsonStr, DogDTO.class, true);
        System.out.println(bean);

    }

}
